﻿
using BaoVeBienCuong.MapFolder.Elements;
namespace BaoVeBienCuong.MapFolder.VisitorFolder
{
    public class CheckVisitor : Visitor
    {
        private bool isRight;
        private int i, j;
        public CheckVisitor()
        {
            isRight = false;
        }
        public bool getRight()
        {
            return isRight;
        }
        public void visit(KhoiI khoiI)
        {
            isRight = true;
            if (khoiI.getHuong().Equals("phai"))
            {
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if ((int)Map.curPosi.Y + i < Map.SizeOfMatrix.Y)
                    {
                        if (Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y + i] == 0) { isRight = false; break; }
                    }
                    else break;
                }
            }
            else if (khoiI.getHuong().Equals("tren"))
            {
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if (((int)Map.curPosi.X - i < 0) || (Map.matrix[(int)Map.curPosi.X - i, (int)Map.curPosi.Y] == 0)) { isRight = false; break; }
                }
            }
            else if (khoiI.getHuong().Equals("duoi"))
            {
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if (((int)Map.curPosi.X + i >= Map.SizeOfMatrix.X) || (Map.matrix[(int)Map.curPosi.X + i, (int)Map.curPosi.Y] == 0)) { isRight = false; break; }
                }
            }
            else
            {
                for (i = 1; i <= khoiI.getDodai(); i++)
                {
                    if ((int)Map.curPosi.Y - i >= 0)
                    {
                        if (Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y - i] == 0) { isRight = false; break; }
                    }
                    else break;
                }
            }
        }//18-02
        public void visit(KhoiL khoiL)
        {
            isRight = true;
            if (khoiL.getHuong().Equals("traitren"))//18-02
            {
                #region sang phải rồi đi lên
                for (i = 1; i <= khoiL.getDocao1(); i++)
                {
                    if (Map.curPosi.Y + i < Map.SizeOfMatrix.Y)
                    {
                        if (Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y + i] == 0)
                        {
                            isRight = false;
                            return;
                        }
                    }
                    else break;
                }
                if (Map.curPosi.Y + khoiL.getDocao1() >= Map.SizeOfMatrix.Y) return;
                else
                {
                    for (j = 1; j < khoiL.getDocao2(); j++)
                    {
                        if ((Map.curPosi.X - j < 0) || (Map.matrix[(int)Map.curPosi.X - j, (int)Map.curPosi.Y + khoiL.getDocao1()]) == 0) { isRight = false; return; }
                    }
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("traiduoi"))//18-02
            {
                #region sang phải rồi xuống dưới
                for (i = 1; i <= khoiL.getDocao1(); i++)
                {
                    if (Map.curPosi.Y + i < Map.SizeOfMatrix.Y)
                    {
                        if (Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y + i] == 0)
                        {
                            isRight = false;
                            return;
                        }
                    }
                    else break;
                }
                if (Map.curPosi.Y + khoiL.getDocao1() >= Map.SizeOfMatrix.Y) return;
                else
                {
                    for (j = 1; j < khoiL.getDocao2(); j++)
                    {
                        if ((Map.curPosi.X + j >= Map.SizeOfMatrix.X) || Map.matrix[(int)Map.curPosi.X + j, (int)Map.curPosi.Y + khoiL.getDocao1()] == 0)
                        {
                            isRight = false;
                            return;
                        }
                    }
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("phaitren"))//18-02
            {
                #region sang trái rồi lên trên
                for (i = 1; i <= khoiL.getDocao1(); i++)//sang trái
                {
                    if ((int)Map.curPosi.Y - i >= 0)
                    {
                        if (Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y - i] == 0) { isRight = false; return; }
                    }
                    else break;
                }
                if (Map.curPosi.Y - khoiL.getDocao1() <= 0) { return; }
                else
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)// lên trên
                    {
                        if (((int)Map.curPosi.X - j < 0) || (Map.matrix[(int)Map.curPosi.X - j, (int)Map.curPosi.Y - khoiL.getDocao1()] == 0)) { isRight = false; return; }
                    }
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("phaiduoi"))//18-02
            {
                #region sang trái rồi xuống dưới
                for (i = 1; i <= khoiL.getDocao1(); i++)//sang trái
                {
                    if ((int)Map.curPosi.Y - i >= 0)
                    {
                        if (Map.matrix[(int)Map.curPosi.X, (int)Map.curPosi.Y - i] == 0) { isRight = false; return; }
                    }
                    else break;
                }
                if (Map.curPosi.Y - khoiL.getDocao1() <= 0) { return; }
                else
                {
                    for (j = 1; j <= khoiL.getDocao2(); j++)// xuống dưới
                    {
                        if (((int)Map.curPosi.X + j >= (int)Map.SizeOfMatrix.X) || (Map.matrix[(int)Map.curPosi.X + j, (int)Map.curPosi.Y - khoiL.getDocao1()] == 0))
                        {
                            isRight = false;
                            return;
                        }
                    }
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("trentrai"))//18-02
            {
                #region xuống dưới rồi sang trái
                for (i = 1; i <= khoiL.getDocao1(); i++) // xuống dưới
                {
                    if (((int)Map.curPosi.X + i >= Map.SizeOfMatrix.X) || (Map.matrix[(int)Map.curPosi.X + i, (int)Map.curPosi.Y] == 0)) { isRight = false; return; }
                }
                for (j = 1; j <= khoiL.getDocao2(); j++)//sang trái
                {
                    if ((int)Map.curPosi.Y - j >= 0)
                    {
                        if (Map.matrix[(int)Map.curPosi.X + khoiL.getDocao1(), (int)Map.curPosi.Y - j] == 0) { isRight = false; return; }
                    }
                    else break;
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("trenphai"))//18-02
            {
                #region xuống dưới rồi sang phải
                for (i = 1; i <= khoiL.getDocao1(); i++) // xuống dưới
                {
                    if (((int)Map.curPosi.X + i >= Map.SizeOfMatrix.X) || (Map.matrix[(int)Map.curPosi.X + i, (int)Map.curPosi.Y] == 0)) { isRight = false; return; }
                }
                for (j = 1; j <= khoiL.getDocao2(); j++)//sang phải
                {
                    if ((int)Map.curPosi.Y + j < Map.SizeOfMatrix.Y)
                    {
                        if (Map.matrix[(int)Map.curPosi.X + khoiL.getDocao1(), (int)Map.curPosi.Y + j] == 0) { isRight = false; return; }
                    }
                    else break;
                }
                #endregion
            }
            else if (khoiL.getHuong().Equals("duoiphai"))//18-02
            {
                #region lên trên rồi sang phải
                for (i = 1; i <= khoiL.getDocao1(); i++) // lên trên
                {
                    if (((int)Map.curPosi.X - i < 0) || (Map.matrix[(int)Map.curPosi.X - i, (int)Map.curPosi.Y] == 0)) { isRight = false; return; }
                }
                for (j = 1; j <= khoiL.getDocao2(); j++)//sang phải
                {
                    if ((int)Map.curPosi.Y + j < Map.SizeOfMatrix.Y)
                    {
                        if (Map.matrix[(int)Map.curPosi.X - khoiL.getDocao1(), (int)Map.curPosi.Y + j] == 0) { isRight = false; return; }
                    }
                    else break;
                }
                #endregion
            }
            else // 18-02
            {
                #region lên trên rồi sang trái
                for (i = 1; i <= khoiL.getDocao1(); i++) // lên trên
                {
                    if (((int)Map.curPosi.X - i < 0) || (Map.matrix[(int)Map.curPosi.X - i, (int)Map.curPosi.Y] == 0)) { isRight = false; return; }
                }
                for (j = 1; j <= khoiL.getDocao2(); j++)//sang trái
                {
                    if ((int)Map.curPosi.Y - j >= 0)
                    {
                        if (Map.matrix[(int)Map.curPosi.X - khoiL.getDocao1(), (int)Map.curPosi.Y - j] == 0) { isRight = false; return; }
                    }
                    else break;
                }
                #endregion
            }
        }
    }
}
